package cn.quevo.core.lang;

import cn.quevo.core.file.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.UUID;

/**
 * String 工具扩展类
 *
 * @author July july_sky@foxmail.com
 * @date 2016年10月10日下午10:12:28
 * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
 */
public class StringUtils extends org.apache.commons.lang3.StringUtils {
    private final static String[] RANDOM_SEED = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
      "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y",
      "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
      "U", "V", "W", "X", "Y", "Z"};

    private final static Logger log = LoggerFactory.getLogger(StringUtils.class);

    /**
     * 检验Map为空或元素为0个
     * <p>
     * <pre>
     * StringUtils.isEmpty(null)							= true
     * StringUtils.isEmpty(new HashMap<String,Object>())	= true
     * </pre>
     *
     * @param map
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月10日下午10:12:50
     */
    public static boolean isEmpty(final Map<?, ?> map) {
        return map == null || map.isEmpty();
    }

    /**
     * 检验Collection为空或者元素为0个
     * <p>
     * <pre>
     * StringUtils.isEmpty(null)					= true
     * StringUtils.isEmpty(new ArrayList<Object>()) = true
     * </pre>
     *
     * @param collection
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月10日下午10:13:02
     */
    public static boolean isEmpty(final Collection<?> collection) {
        return collection == null || collection.isEmpty();
    }

    /**
     * 验证数字是否为空且大于0
     *
     * @param num
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月10日下午10:13:13
     */
    public static boolean isBlank(final Number num) {
        return isBlank(num, 0);
    }

    /**
     * 验证数字是否为空且大于min
     *
     * @param num
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月10日下午10:13:13
     */
    public static boolean isBlank(final Number num, final Number min) {
        return num == null || num.doubleValue() < min.doubleValue();
    }

    /**
     * 验证Object是否为空
     * <ul>
     * <li>StringUtils.isBlank(null) = true</li>
     * <li>如果{@code Map}是Map类型，则调用StringUtils.isEmpty(Map<?,?> map)</li>
     * <li>如果{@code Collection}是Collection类型，则调用StringUtils.isEmpty(Collection<?>
     * collection)</li>
     * <li>如果不是Map也不是Collection则当字符串处理</li>
     * </ul>
     *
     * @param obj
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月10日下午10:13:28
     */
    public static boolean isBlank(final Object obj) {
        if (obj == null) {
            return true;
        }
        if (obj instanceof Map) {
            return isEmpty((Map<?, ?>) obj);
        }
        if (obj instanceof Collection) {
            return isEmpty((Collection<?>) obj);
        }
        return isBlank(obj.toString());
    }

    /**
     * 获取UUID编码，去掉-，转成固定32为长度字符串
     *
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月10日下午10:13:36
     */
    public static String getUUID() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }

    /**
     * 逐个替换正则匹配的内容
     *
     * @param str
     * @param rgx
     * @param args
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月10日下午10:13:45
     */
    public static String format(String str, String rgx, String... args) {
        if (isBlank(args)) {
            return str;
        }
        rgx = rgx.replace("{", "\\{");
        rgx = rgx.replace("}", "\\}");
        for (String s : args) {
            str = str.replaceFirst(rgx, s == null ? "" : s);
        }
        return str;
    }

    /**
     * 获取随机字符串
     *
     * @param length
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月10日下午10:13:52
     */
    public static String getRandomStr(int length) {
        StringBuffer random = new StringBuffer();
        Random r = new Random();
        for (int i = 0; i < length; i++) {
            random.append(RANDOM_SEED[r.nextInt(RANDOM_SEED.length)]);
        }
        return random.toString();
    }

    /**
     * 获取随机数字字符串
     *
     * @param length
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月10日下午10:13:58
     */
    public static String getRandomNum(int length) {
        StringBuffer random = new StringBuffer();
        Random r = new Random();
        for (int i = 0; i < length; i++) {
            random.append(RANDOM_SEED[r.nextInt(10)]);
        }
        return random.toString();
    }

    /**
     * 替换字符串中正则匹配的所有内容
     *
     * @param str
     * @param regex
     * @param replace
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月10日下午10:14:08
     */
    public static String replaceAll(String str, String regex, String replace) {
        return str.replaceAll(regex, replace);
    }

    /**
     * 验证数组是否重复
     *
     * @param args
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月10日下午10:14:15
     */
    public static boolean isRepeat(String... args) {
        if (args == null || args.length <= 1) {
            return false;
        }
        if (args.length == 2) {
            return args[0].equals(args[1]);
        }
        Set<String> set = new HashSet<>();
        set.addAll(Arrays.asList(args));
        return args.length != set.size();
    }

    /**
     * 验证是否包含在字符串数组中
     *
     * @param key
     * @param args
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月11日下午4:01:06
     */
    public static boolean contains(String key, String... args) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(args)) {
            return false;
        }
        for (String arg : args) {
            if (key.equals(arg)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 将Object转换成String
     *
     * @param val
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年11月3日下午8:35:09
     */
    public static String valueOf(Object val) {
        return val == null ? null : val.toString();
    }

    /**
     * 将Object转换成String
     *
     * @param val
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年11月3日下午8:35:09
     */
    public static String valueOfNull(Object val) {
        return val == null ? "" : val.toString();
    }

    /**
     * 隐藏手机号中间四位
     *
     * @param mobile
     * @return
     */
    public static String hideMobile(String mobile) {
        if (!RegularUtils.mobileCheck(mobile)) {
            return mobile;
        }
        return mobile.substring(0, 3) + "****" + mobile.substring(7);
    }

    /**
     * 字符串连接
     *
     * @param args
     * @return
     */
    public static String concats(String... args) {
        if (args == null || args.length == 0) {
            return null;
        }
        if (args.length == 1) {
            return args[0];
        }
        StringBuilder strBuil = new StringBuilder();
        for (String str : args) {
            if (str != null) {
                strBuil.append(str);
            }
        }
        return strBuil.toString();
    }

    /**
     * 数字格式化
     *
     * @param obj
     * @param pattern
     * @return
     * @author July july_sky@foxmail.com
     * @date 2018-03-09 16:45:01
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    public static String formatNum(Object obj, String pattern) {
        try {
            if (StringUtils.isBlank(obj)) {
                return null;
            }
            DecimalFormat df = null;
            if (pattern == null) {
                df = new DecimalFormat();
            } else {
                df = new DecimalFormat(pattern);
            }
            if (obj instanceof Number) {
                return df.format(obj);
            }
            return df.format(NumberUtils.createNumber(obj.toString()));
        } catch (Exception e) {
            log.error("beetl数字格式化异常", e);
        }
        return null;
    }

    /**
     * 将阿拉伯数字转换成中文数字
     *
     * @param num
     * @return
     * @author July july_sky@foxmail.com
     * @date 2018-03-09 16:50:25
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    public static String convertNumber(String num) {
        String str = "";
        switch (num) {
            case "1":
                str = "一";
                break;
            case "2":
                str = "二";
                break;
            case "3":
                str = "三";
                break;
            case "4":
                str = "四";
                break;
            case "5":
                str = "五";
                break;
            case "6":
                str = "六";
                break;
            case "7":
                str = "七";
                break;
            case "8":
                str = "八";
                break;
            case "9":
                str = "九";
                break;
            case "0":
                str = "〇";
                break;
            default:
                break;
        }
        return str;
    }

    /**
     * 将定义的分隔符(|、\n(换行)、#\,)转换成指定字符串
     *
     * @param str
     * @param replace
     * @return
     * @author July july_sky@foxmail.com
     * @date 2018-03-09 16:51:59
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    public static String formatSplitHtml(String str, String replace) {
        if (StringUtils.isBlank(str)) {
            return "";
        }
        return str.replaceAll("\\||\n|,|#", "<br/>");
    }

    /**
     * 按照定义的分隔符(|、\n(换行)、#\,)分割成数组
     *
     * @param str
     * @return
     * @author July july_sky@foxmail.com
     * @date 2018-03-09 16:52:25
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    public static String[] getSplitHtml(String str) {
        if (StringUtils.isBlank(str)) {
            return null;
        }
        return str.split("\\||\n|,|#");
    }

    /**
     * 按照指定的分隔符分割成数组
     *
     * @param str
     * @param split
     * @return
     * @author July july_sky@foxmail.com
     * @date 2018-03-09 16:57:27
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    public static String[] getSplitHtml(String str, String split) {
        if (StringUtils.isBlank(str)) {
            return null;
        }
        return str.split(split);
    }

    /**
     * 获取缩略图文件路径
     *
     * @param img
     * @param name
     * @return
     * @author July july_sky@foxmail.com
     * @date 2018-03-09 17:07:26
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    public static String getImgThum(String img, String name) {
        if (StringUtils.isBlank(img) || StringUtils.isBlank(name)) {
            return img;
        }
        String suffix = FileUtils.getFileSuffix(img);
        String pre = img.substring(0, img.lastIndexOf("."));
        return pre + "_" + name + suffix;
    }

    /**
     * 格式化字符串
     *
     * @param val 原始值
     * @param def 默认值
     * @return
     */
    public static String formatString(Object val, String def) {
        return StringUtils.isBlank(val) ? def : val.toString();
    }
}
